home *** CD-ROM | disk | FTP | other *** search
/ SGI Hot Mix 17 / Hot Mix 17.iso / HM17_SGI / research / lib / calendar.pro < prev    next >
Text File  |  1997-07-08  |  5KB  |  221 lines

  1. ; $Id: calendar.pro,v 1.4 1997/01/15 03:11:50 ali Exp $
  2. ;
  3. ; Copyright (c) 1988-1997, Research Systems, Inc.  All rights reserved.
  4. ;    Unauthorized reproduction prohibited.
  5. ;
  6.  
  7. ;+
  8. ; NAME:
  9. ;    CALENDAR
  10. ;
  11. ; PURPOSE:
  12. ;    Display a calandar for a month or an entire year using IDL's
  13. ;    plotting subsystem. This IDL routine imitates the Unix cal
  14. ;    command.
  15. ;
  16. ; CATEGORY:
  17. ;    Misc.
  18. ;
  19. ; CALLING SEQUENCE:
  20. ;    CALENDAR
  21. ;    CALENDAR, YEAR
  22. ;    CALENDAR, MONTH, YEAR
  23. ;
  24. ; INPUTS:
  25. ;    If called without arguments, CALENDAR draws a calendar for the
  26. ;    current month.
  27. ;
  28. ;    MONTH:  The number of the month for which a calandar is
  29. ;        desired (1 is January, 2 is February, ..., 12 is December).
  30. ;
  31. ;    YEAR:   The number of the year for which a calendar should be
  32. ;        drawn. If YEAR is provided without MONTH, a calendar
  33. ;        for the entire year is drawn.
  34. ;
  35. ; OPTIONAL INPUT PARAMETERS:
  36. ;    None.
  37. ;
  38. ; OUTPUTS:
  39. ;    The specified calandar is drawn on the current graphics device.
  40. ;
  41. ; COMMON BLOCKS:
  42. ;    None.
  43. ;
  44. ; SIDE EFFECTS:
  45. ;    None.
  46. ;
  47. ; RESTRICTIONS:
  48. ;    None.
  49. ;
  50. ; MODIFICATION HISTORY:
  51. ;    AB, September, 1988
  52. ;-
  53. ;
  54.  
  55.  
  56. pro CAL_INFO, MONTH, YEAR, START_SQUARE, NUM_DAYS
  57.  
  58. L_MONTH = MONTH - 1
  59. MONTHS = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
  60.  
  61. DAY = (JULDAY(1, 1, YEAR) + 1) MOD 7
  62. DAY1_NEXT_YEAR = (JULDAY(1, 1, YEAR+1) + 1) MOD 7
  63.  
  64. case ((DAY1_NEXT_YEAR + 7 - DAY) mod 7) of
  65.     2 :
  66.     1 : MONTHS[1] = 28    ; Not a leap year
  67.     else: MONTHS[8] = 19    ; 1752
  68.     endcase
  69.  
  70. for I = 0, L_MONTH - 1 do DAY = DAY + MONTHS[I]
  71. START_SQUARE = (DAY MOD 7)
  72. NUM_DAYS = MONTHS[L_MONTH]
  73. end
  74.  
  75.  
  76.  
  77.  
  78.  
  79.  
  80. pro DRAW_CAL, XR, YR, MONTH, YEAR, SMALL
  81.  
  82. MONTHS = ['January','February','March','April','May','June','July','August', $
  83.       'September','October','November','December']
  84.  
  85. x_range = xr[1] - xr[0]
  86. y_range = yr[1] - yr[0]
  87. if (SMALL) then y_div = 7. else y_div = 6.
  88. x_delta = x_range / 7.
  89. y_delta = y_range / y_div
  90.  
  91. TSIZE = 2.5 * x_range
  92. if (SMALL) then TSIZE = TSIZE * 1.75
  93.  
  94. if (not SMALL) then begin
  95.     ; Frame
  96.     plots,/norm,[xr[0],xr[1],xr[1],xr[0],xr[0]],[yr[0],yr[0],yr[1],yr[1],yr[0]]
  97.     ; Draw Vertical lines
  98.     y = yr[1] - y_delta
  99.     for i = 1,6 do begin x=xr[0]+ i*x_delta & plots,[x,x],[yr[0],y],/norm & end
  100.     ; Draw Horizontal lines
  101.     for i=0,y_div do begin y=yr[0]+i*y_delta & plots,[xr[0],xr[1]],[y,y], $
  102.     /norm & end
  103.     endif
  104.  
  105. ; Month and year title
  106. if (SMALL) then begin
  107.     x = xr[0] + 3.5 * x_delta
  108.     y = yr[0] + 6.6 * y_delta
  109.     xyouts,/norm,size=TSIZE*1.6, align=.5, x, y, MONTHS[MONTH-1]
  110.     endif else begin
  111.     x = xr[0] + 1.5 * x_delta
  112.     y = yr[0] + 5.5 * y_delta
  113.     xyouts,/norm,size=TSIZE*.9, align=.5, x, y, MONTHS[MONTH-1]
  114.     x = xr[0] + 5.5 * x_delta
  115.     xyouts,/norm,size=TSIZE*.9,align=.5, x, y, $
  116.         strcompress(string(YEAR),/rem)
  117.     endelse
  118.  
  119. ; Day titles
  120. if (SMALL) then begin
  121.     DAYS = ['S', 'M', 'T', 'W', 'T', 'F', 'S']
  122.     DAYSIZE = TSIZE * .75
  123.     y = yr[0] + 5.8 * y_delta
  124.     y_factor = .25
  125.     endif else begin
  126.     DAYS = ['SUN', 'MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT']
  127.     DAYSIZE = TSIZE * .6
  128.     y = yr[0] + 5.1 * y_delta
  129.     endelse
  130. for I = 0, 6 do xyouts,/norm,size=DAYSIZE, align=.5, $
  131.     xr[0] + (I + .5) * x_delta , y, DAYS[I]
  132.  
  133. ; Calculate Horizontal and Vertical positions
  134. X = fltarr(7)
  135. Y = fltarr(y_div)
  136. if (SMALL) then begin
  137.     for i = 0, 5 do Y[I] = yr[0] + (5-I) * y_delta
  138.     for i = 0, 6 do X[I] = xr[0] + (I - .5) * x_delta
  139.     NALIGN = .5            ; Center numbers
  140.     NSIZE = TSIZE
  141.     endif else begin
  142.     J = 0
  143.     for i = 4.65, .5, -1 do begin
  144.         Y[J] = i
  145.         J = J + 1
  146.         endfor
  147.     Y[5] = .3 
  148.     for i = 0, 5 do Y[I] = yr[0] + Y[I] * y_delta
  149.     for i = 0, 6 do X[I] = xr[0] + (I + .95) * x_delta
  150.     NALIGN = 1.            ; Right justify
  151.     NSIZE = TSIZE 
  152.     endelse
  153.  
  154. ; Get starting square and number of days in month
  155. CAL_INFO, MONTH, YEAR, COL, NUM_DAYS
  156. ROW = 0
  157.  
  158. ; Numbers
  159. for I = 1, NUM_DAYS do begin
  160.     if (COL gt 6) then begin ROW = ROW + 1 & COL = 0 & endif
  161.     xyouts, /norm, size=TSIZE, align = NALIGN, X[COL], Y[ROW], I
  162.     COL = COL + 1
  163.     endfor
  164.  
  165. end
  166.  
  167.  
  168.  
  169.  
  170.  
  171.  
  172.  
  173. pro CALENDAR , MONTH, YEAR
  174.  
  175. ON_ERROR, 2        ; Return to caller if errors
  176.  
  177. MONTHS = ['JAN','FEB','MAR','APR','MAY','JUN','JUL','AUG', $
  178.       'SEP','OCT','NOV','DEC']
  179.  
  180. ; Process the input
  181. NP = n_params()
  182. case NP of
  183.     0: begin
  184.         DATE = systime()
  185.         L_MONTH = long(where(strupcase(strmid(DATE, 4, 3)) eq MONTHS))
  186.         L_MONTH = L_MONTH[0] + 1    ; Scalarize it...
  187.         L_YEAR = long(strmid(DATE, 20, 4))
  188.         end
  189.     1: begin
  190.         L_YEAR=LONG(MONTH)        ; Only 1 parm, take it as year
  191.         DO_ALL_YEAR = 1
  192.         end
  193.     2: begin
  194.         L_MONTH = LONG(MONTH)
  195.         L_YEAR=LONG(YEAR)
  196.         end
  197.     else: message, 'Wrong number of parameters.'
  198.     endcase
  199.  
  200. erase
  201. if (NP eq 1) then begin
  202.     x_delta = .2325
  203.     y_delta = .28
  204.     l = .025
  205.     r = .975
  206.     plots,/norm,[l,r,r,l,l],[l,l,r,r,l]
  207. ;    plots,/norm,[l,r],[.9,.9]
  208.     xyouts,/norm,size=2.75,align=.5, .5, .9, $
  209.         strcompress(string(L_YEAR),/rem)
  210.     cur = 1
  211.     for i = 2, 0, -1 do for j = 0, 3 do begin
  212.         DRAW_CAL, [l + (j+.1)*x_delta, l + (j+1)*x_delta], $
  213.         [l + l + i*y_delta, l + (i+1)*y_delta], cur, L_YEAR, 1
  214.         CUR = CUR + 1
  215.         endfor
  216.     endif else begin
  217.     DRAW_CAL, [.025, 0.975], [.025, .975], L_MONTH, L_YEAR, 0
  218.     endelse
  219.  
  220. end
  221.